//创建地图
//参数：地图容器、地图zoom级别、中心点经度、中心点纬度、所有监控对象的数组
var mapObj;
function mapInit() {
	var mapOptions             = new MMapOptions();									//构建地图辅助类
	mapOptions.zoom            = OnloadZoom;												//设置地图zoom级别
	mapOptions.center          = new MLngLat(OnloadCenterLng, OnloadCenterLat);  						 	//设置地图中心点
	mapOptions.toolbar         = DEFAULT;											//工具条
	mapOptions.toolbarPos      = new MPoint(15,15);									//工具条
	mapOptions.overviewMap     = SHOW;												//是否显示鹰眼
	mapOptions.scale           = SHOW;												//是否显示比例尺
	mapOptions.returnCoordType = COORD_TYPE_OFFSET;									//返回数字坐标
	mapOptions.zoomBox = true;														//鼠标滚轮缩放和双击放大时是否有红框动画效果。
	
	mapObj=new MMap(iCenter, mapOptions);	 										//地图初始
	
	//显示中心位置
	mapObj.addEventListener(mapObj,DRAG_END,centerNow);
}

//添加标注
//参数：标注ID、经度、纬度、是否可编辑、是否显示信息窗口、标注图片
var MarkerArr = [];
function AddMarker(markerID, Lng, Lat, isEditable, isShowTip, imageUrl,content){
	//添加信息窗口
	var tipOption = new MTipOptions();
	tipOption.title = "警力信息";	
	//typeWord = markerArr[markerID].type == '警员'?'警员':(markerArr[markerID].type == '警车'?'警车':'警用摩托')
	tipOption.content = content;
	
	//构建一个名为markerOption的点选项对象
	var markerOption = new MMarkerOptions();
	//标注图片URL
	markerOption.imageUrl = imageUrl;
	//图片相对于锚点的偏移位置
	markerOption.anchor = new MPoint(0,0);
	//图片相对于锚点的九宫格位置
	markerOption.imageAlign = BOTTOM_CENTER;
	//标注是否可以拖拽编辑
	markerOption.isEditable = isEditable;
	//设置点的信息窗口参数选项   
	markerOption.tipOption = tipOption; 
	//是否弹出信息窗口
	markerOption.canShowTip = isShowTip;
	//图标旋转的角度
	markerOption.rotation = "0";
	//通过经纬度坐标及参数选项确定标注信息
	var str=gpsToMap(Lng, Lat);
	var array=str.split(',');
	Lng=array[0];
	Lat=array[1];
	Mmarker = new MMarker(new MLngLat(Lng, Lat), markerOption);
	//对象编号，也是对象的唯一标识
	Mmarker.id = 'AllMarker'+markerID;
	
	//将所有标注对象压入数组，设置覆盖物到合适的地图视野级别时用到的
	MarkerArr.push(Mmarker.id);
	//向地图添加覆盖物
	mapObj.addOverlay(Mmarker,false);
}

//默认的显示所有警员、警车标注
function Markers(array,str){
	//每次添加标注前清除以前的
	mapObj.removeOverlaysByType(MOverlay.TYPE_MARKER);
	//判断标注要显示的图片
	function witchImg(type){
		switch(type){
			case '人员':
				var imageUrl = 'images/ico_man.gif';
				break;
			case '车辆':
				var imageUrl = 'images/ico_car.gif';
				break;
			case '摩托':
				var imageUrl = 'images/ico_moto.gif';
				break;
		}
		return imageUrl;
	}
	//循环添加所有标记
	
	for( var i=0; i<array.length; i++){
		AddMarker(i, array[i].lng, array[i].lat, false, true, witchImg(array[i].type),array[i].con)
	}
}

//实施路线运动的警车
function RealTimeMarker(ID, Lng, Lat, isShowTip, imageUrl, rotation){
	var tipOption = new MTipOptions();
    tipOption.title="警力信息";
    tipOption.content="<br>这里可以写该警力的详细信息!<br>";
	
    var markerOption = new MMarkerOptions();
	markerOption.imageAlign = MIDDLE_CENTER;
    markerOption.tipOption = tipOption;
	markerOption.imageUrl =imageUrl;
	markerOption.rotation=rotation;
    markerOption.canShowTip= isShowTip;
    var str=gpsToMap(Lng, Lat);
	var array=str.split(',');
	Lng=array[0];
	Lat=array[1];
    var marker = new MMarker(new MLngLat(Lng, Lat), markerOption);
    marker.id=ID;
    mapObj.addOverlay(marker,false);
}

//单独一个标注
function SingleMarker(ID, Lng, Lat, isShowTip, imageAlign, anchors, imageUrl, rotation){
	var tipOption = new MTipOptions();
	
    var markerOption = new MMarkerOptions();
	markerOption.imageAlign = imageAlign;
	markerOption.anchor = new MPoint(anchors[0],anchors[1]);
    markerOption.tipOption = tipOption;
	markerOption.imageUrl =imageUrl;
	markerOption.rotation=rotation;
    markerOption.canShowTip= isShowTip;
    var str=gpsToMap(Lng, Lat);
	var array=str.split(',');
	Lng=array[0];
	Lat=array[1];
    var marker = new MMarker(new MLngLat(Lng, Lat), markerOption);
    marker.id=ID;
    mapObj.addOverlay(marker,false);
}

//根据两点坐标计算角度
function PointPointC(lng1, lat1, lng2, lat2){
	var str1=gpsToMap(lng1, lat1);
	var array1=str1.split(',');
	lng1=array1[0];
	lat1=array1[1];
	var str2=gpsToMap(lng2, lat2);
	var array2=str2.split(',');
	lng2=array2[0];
	lat2=array2[1];
	var LineX = Math.abs(Number(lng2)-Number(lng1));//计算Y长度并转换为正值
	var LineY = Math.abs(Number(lat2)-Number(lat1));//计算X长度并转换为正值
	var LineTan = LineY/LineX;						//计算正切
	var LineAtan = Math.atan(LineTan);				//计算反正切
	var LineC = LineAtan*180/Math.PI;				//计算正角度
	
	//判断在哪个区间计算角度
	if(Number(lng2)-Number(lng1)>=0 && Number(lat2)-Number(lat1)>0){
		LineC = 360-LineC;
	}else if(Number(lng2)-Number(lng1)<0 && Number(lat2)-Number(lat1)>=0){
		LineC = 180+LineC;
	}else if(Number(lng2)-Number(lng1)<=0 && Number(lat2)-Number(lat1)<0){
		LineC = 180-LineC;
	}else if(Number(lng2)-Number(lng1)>0 && Number(lat2)-Number(lat1)<=0){
		LineC = LineC;
	}
	//返回角度
	return LineC;
}

//地图中心移动至指定坐标
function panto(Lng, Lat){
	var str=gpsToMap(Lng, Lat);
	var array=str.split(',');
	Lng=array[0];
	Lat=array[1];
	mapObj.panTo(new MLngLat(Lng, Lat));
}

//地图中心移动至指定坐标
function pantoPoint(Lng, Lat){
	var str=gpsToMap(Lng, Lat);
	var array=str.split(',');
	Lng=array[0];
	Lat=array[1];
	var point=new MLngLat(Lng, Lat);
	mapObj.panTo(point);
}

//重新设置地图中心为指定坐标
function SetMapCenter(Lng, Lat){
	var str=gpsToMap(Lng, Lat);
	var array=str.split(',');
	Lng=array[0];
	Lat=array[1];
	mapObj.setCenter(new MLngLat(Lng, Lat));
}

//设置地图缩放级别
function SetZoom(zoom){
	mapObj.setZoomLevel(zoom);
}

//根据坐标数组画线
var LineArr = [];
function addMPolyline(LngLat, ID){
	
	var MapLngLat=gpsToMaps(LngLat.join(";"));
	var array=[];
	for(var i=0;i<MapLngLat.length;i++){
		array.push(new MLngLat(MapLngLat[i][0],MapLngLat[i][1]));
	}
	var tipOption       = new MTipOptions();				//添加信息窗口
    tipOption.title     = "信息窗口标题";						//信息窗口标题
    tipOption.content   = "信息窗口内容";						//信息窗口内容

	var linestyle	    = new MLineStyle();					//创建线样式对象
	linestyle.thickness = 3;								//线的粗细度
	linestyle.color     = 0x0000ff;							//线的颜色，16进制整数，默认为0x005890（蓝色）
	linestyle.lineType  = LINE_SOLID;						//线的表现样式，LINE_SOLID，实线（默认），LINE_DASHED，虚线
	linestyle.alpha		= 0.6;								//透明度
	
	var lineopt         = new MLineOptions();				//构造一个名为lineopt的线选项对象
	lineopt.lineStyle	= linestyle;						//设置线的边缘风格
	lineopt.tipOption	= tipOption;						//设置线的信息窗口参数选项
	lineopt.canShowTip	= false;							//设置是否在地图中显示信息窗口，true，可显示（默认）；false，不显示
	lineopt.isEditable	= false;							//设置线是否为可编辑状态，true，可编辑；false，不可编辑（默认）
	var polyline		= new MPolyline(array,lineopt);		//通过经纬度坐标数组及参数选项构建多折线对象，arr是经纬度坐档数组
	
	mapObj.addOverlay(polyline,true);						//向地图添加覆盖物
}

//计算两点距离
//参数说明，经度1，纬度1，经度2，纬度2
var DEF_PI = 3.14159265359
var DEF_2PI = 6.28318530712
var DEF_PI180 = 0.01745329252
var DEF_R = 6370693.5
function GetShortDistance(lng1, lat1, lng2, lat2){ 
	var ew1, ns1, ew2, ns2; 
	var dx, dy, dew; 
	var distance; 
	//角度转换为弧度 
	ew1 = lng1 * DEF_PI180; 
	ns1 = lat1 * DEF_PI180; 
	ew2 = lng2 * DEF_PI180; 
	ns2 = lat2 * DEF_PI180; 
	//经度差 
	dew = ew1 - ew2; 
	//若跨东经和西经180 度，进行调整 
	if (dew > DEF_PI) 
		dew = DEF_2PI - dew; 
	else if (dew < -DEF_PI) 
		dew = DEF_2PI + dew; 
	dx = DEF_R * Math.cos(ns1) * dew;       // 东西方向长度(在纬度圈上的投影长度) 
	dy = DEF_R * (ns1 - ns2);           // 南北方向长度(在经度圈上的投影长度) 
 
	//勾股定理求斜边长 
	distance = Math.sqrt(dx * dx + dy * dy); 
	return distance; 
}

//当前中心位置
function centerNow(){
	if(!mapObj){
		return false;
	}
	var mls =new MReGeoCodeSearch();
	var mlsp= new MReGeoCodeSearchOptions();
	mlsp.poiNumber=1; //返回周边的POI数量,默认10   
	mlsp.range=10;    //限定周边热点POI和道路的距离范围   
	mls.setCallbackFunction(poiToAddressSearch_CallBack);
	mls.poiToAddressSimple (mapObj.getCenter(),mlsp);
}

function poiToAddressSearch_CallBack(data){   
    var resultStr="";   
    if(data.error_message != null){   
        resultStr="查询异常！"+data.error_message;   
    }else{
		//将结果分割成数组
		var data_arr = data.message.split(';');
		//显示区
		document.getElementById('centerNow').innerHTML = data_arr[0];
		//显示详细信息
		document.getElementById('pmenu').innerHTML = data_arr[1]+'，'+data_arr[2];
    }   
}

/**
 * 单个GPS数据偏转纠正
 * 先查询数据库有相关的坐标偏转，如果有就不调用mapabc的偏转接口，
 * 如果没有，先调用mapabc的偏转接口，再插入数据库
 */
function gpsToMap(lng,lat){
	var coord;
	$.ajax({
		type:"POST",
		url:'public/gpsToMap.php',
		async:false,
		dataType:'json',
		data:'act=single&lng='+lng+'&lat='+lat+'&t='+Math.random(),
		success:function(data){
			if(data.message=="ok"){
				var decodelng=data.list[0].x;
				var decodelat=data.list[0].y;
				str = decodelng+","+decodelat;
				coord=str;
			}else{
				alert('偏转没有成功');
				return false;
			}
		},
		error:function(){
			alert('偏转超时');
			return false;
		}
	});

	return coord;
}


/**
 * 多个GPS数据偏转纠正
 * 以数组形式请求，返回形式也是数组
 * 先查询数据库有相关的坐标偏转，如果有就不调用mapabc的偏转接口，
 * 如果没有，先调用mapabc的偏转接口，再插入数据库
 */
function gpsToMaps(array){
	if(array==""){
		alert('坐标为空，请确认操作是否正确');
		return false;
	}
	var PointArr = [];
	$.ajax({
		type:"POST",
		url:'public/gpsToMap.php',
		async:false,
		dataType:'json',
		data:'act=all&coors='+array+'&t='+Math.random(),
		success:function(data){
			if(data.message=="ok"){
				var list=data.list;
				for(var i=0;i<list.length;i++){
					PointArr.push([list[i].x, list[i].y]);
				}
			}else{
				alert('偏转没有成功');
				return false;
			}
		},
		error:function(){
			alert('由于坐标太多，偏转超时');
			return false;
		}
	});
	return PointArr;
}